<?php

Class Gallery {

   // Путь для хранения
   var $imgDir = './img/';

   var $thumbDir = './img/thumb/';

   // Размер маленьких изображений
   var $imgWidth = 100;
   var $imgHeight = 100;

   //Размер большого изображения
   var $imgWidthB = 5000;
   var $imgHeightB = 50000;

   var $imgName = '';

   var $msg = array();

   // Разрешенные форматы изображений
   var $exts = array(1 => 'gif',
                     2 => 'jpg',
                     3 => 'png');

   var $extList = array('image/gif', 'image/jpeg', 'image/png');


   function __construct() {
   	$this->imgDir = IMAGES . 'upload/';
   	$this->thumbDir = IMAGES . 'upload/thumb/';
   	
       if(!is_dir($this->imgDir) || !is_dir($this->thumbDir)) {
       	$msg[] = 'Указаной директории не существует!';
       }
   }

   // Проверка изображения
   private function checkImg($img) {
       if(!is_file($img['tmp_name'])) return('Ошибка записи изображения на сервер');

       $data = getimagesize($img['tmp_name']);
       $filesize = filesize($img['tmp_name']);
       $format = explode('.',$img['name']);

       if(!in_array($format[count($format)-1], $this->exts)) return('Неверный формат изображения. Возможные типы файлов: jpeg, png, gif');
       if($filesize == 0) return('Файл не является изображением');
       if($data[0] > $this->imgWidthB || $data[1] > $this->imgHeightB) return('Слишком большой размер изображения');
       if(!isset($this->exts[$data[2]])) return('Неверный формат изображения. Возможные типы файлов: jpeg, png, gif');
       if(!in_array($img['type'], $this->extList) || !in_array($data['mime'], $this->extList)) return('Файл не является изображением. Возможные типы файлов: jpeg, png, gif');

       $result = array('width' => $data[ 0],
                       'height' => $data[1],
                       'extension' => $this->exts[$data[2]],
                       'size' => $filesize);

       return $result;
   }

   public function loadImg($img) {

       $data = $this->checkImg($img);

       if(!is_array($data)) return array('error'=>'Переданные данные не корректны!');

       $this->imgName = $this->imgNewName($data['extension']);
       if(!move_uploaded_file($img['tmp_name'], $this->imgDir . $this->imgName)) return('Ошибка записи изображения на сервер');

       $this->creatThumb($data['extension'], $this->imgName);

       return array('success'=>$this->imgName);
   }

   private function creatThumb($type, $name) {

       switch($type) {
           case 'gif':
           $src_img = imagecreatefromgif($this->imgDir.$name);
           break;

           case 'jpg':
           $src_img = imagecreatefromjpeg($this->imgDir.$name);
           break;

           case 'png':
           $src_img = imagecreatefrompng($this->imgDir.$name);
           break;
       }

       $old_w = imagesx($src_img);
       $old_h = imagesy($src_img);

       $ratio1 = $old_w/$this->imgWidth;
       $ratio2 = $old_h/$this->imgHeight;

       if($ratio1>$ratio2) {
           $thumb_w=$this->imgWidth;
           $thumb_h=$old_h/$ratio1;
       }
       else {
           $thumb_h=$this->imgHeight;
           $thumb_w=$old_w/$ratio2;
       }

       $im = imagecreatetruecolor($thumb_w, $thumb_h);
       imagecopyresampled($im,$src_img, 0, 0, 0, 0,$thumb_w,$thumb_h,$old_w,$old_h);

       switch($type) {
           case 'gif':
           imagegif($im, $this->thumbDir.$name);
           break;

           case 'jpg':
           imagejpeg($im, $this->thumbDir.$name);
           break;

           case 'png':
           imagepng($im, $this->thumbDir.$name);
           break;
       }
   }

   // Метод для генерации названий
   private function imgNewName($type) {
       $imgName = mt_rand(0000,9999).'_'.mt_rand(00,99).'.'.$type;

       if(file_exists($this->imgDir.$imgName)) {
           $imgName = $this->imgNewName();
       }

       return $imgName;
   }
	
	/**
	 * сохраняем добавленное изображение в бд
	 *
	 */
	public static function saveAttacheImage($name, $essence, $idEssence){
		$objDB = Service_Database::instance();
		$stmt = "
		INSERT INTO `images` (`name`, `essence_type`, `ID_essence`)
		VALUES ('" . $name . "', " . $essence . ", " . $idEssence . ")";
		$objDB->query($stmt);
	}
	
	/**
	 * порлучаем изображения сущности
	 */
	public static function getEssenceImages($essence, $idEssence){
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `images`.`name`, `images`.`title`, `images`.`ID_image`
		FROM `images`
		WHERE `images`.`essence_type` = " . $essence . " AND `images`.`ID_essence` = " . $idEssence;
		return $objDB->select($stmt);
	}
	
	/**
	 * обновляем title
	 *
	 */
	public static function updateTitle($title, $idImage){
		$objDB = Service_Database::instance();
		$stmt = "
		UPDATE `images`
		SET `images`.`title` = '" . $title . "'
		WHERE `images`.`ID_image` = " . $idImage;
		return $objDB->query($stmt);
	}
	
	/**
	 * удаляем изображение
	 *
	 */
	public function deleteImage($name){
		unlink($this->imgDir.$name);
		unlink($this->thumbDir.$name);
		$objDB = Service_Database::instance();
		$stmt = "
		DELETE
		FROM `images`
		WHERE `images`.`name` = '" . $name . "'";
		return $objDB->query($stmt);
	}
	
	/**
	 * удаляем изображения
	 *
	 */
	public function deleteEssenceImages($essence, $idEssence){
		$objDB = Service_Database::instance();
		$objGallery = new Gallery();
		$stmt = "
		SELECT `images`.`name`
		FROM `images`
		WHERE `images`.`essence_type` = " . $essence . " AND `images`.`ID_essence` = " . $idEssence;
		$arrImages = $objDB->selectSimpleArray($stmt);
		
		if (!empty($arrImages)){
			foreach ($arrImages as $images)
				$objGallery->deleteImage($images);
		}
	}
	
	/**
	 * делаем изображение главным
	 *
	 */
	public static function makeImageMain($idImage, $essence, $idEssence){
		$objDB = Service_Database::instance();
		$stmt = "
		UPDATE `" . Service_Essence::getEssenceTypeName($essence) . "`
		SET `ID_image` = " . $idImage . "
		WHERE `ID_" . Service_Essence::getEssenceTypeName($essence) . "` = " . $idEssence;
		return $objDB->query($stmt);
	}
	
	/**
	 * удаляет главное изображение
	 *
	 */
	public static function unmakeImageMain($idImage, $essence, $idEssence){
		$objDB = Service_Database::instance();
		$stmt = "
		UPDATE `" . Service_Essence::getEssenceTypeName($essence) . "`
		SET `ID_image` = NULL
		WHERE `ID_" . Service_Essence::getEssenceTypeName($essence) . "` = " . $idEssence;
		return $objDB->query($stmt);
	}
	
	/**
	 * получаем главную фотографию
	 */
	public static function getMainImage($essence, $idEssence){
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `" . Service_Essence::getEssenceTypeName($essence) . "`.`ID_image`
		FROM `" . Service_Essence::getEssenceTypeName($essence) . "`
		WHERE `" . Service_Essence::getEssenceTypeName($essence) . "`.`ID_" . Service_Essence::getEssenceTypeName($essence) . "` = " . $idEssence;
		return $objDB->selectSimpleField($stmt);
	}
	
	/**
	 * получаем все изображения
	 *
	 */
	public static function getAllImages(){
		$objDB = Service_Database::instance();
		$stmt  = "
		SELECT *
		FROM `images`";
		return $objDB->select($stmt);
	}

}
?>